#pragma once

#include <functional>

#include <esp_timer.h>
#include <esp_pm.h>

/**
 * @brief 电源节能定时器类
 * 
 * 管理设备的低功耗模式，包括睡眠和关机功能
 */
class PowerSaveTimer {
public:
    /**
     * @brief 构造函数
     * 
     * @param cpu_max_freq CPU最大频率
     * @param seconds_to_sleep 进入睡眠模式前的空闲秒数，默认20秒
     * @param seconds_to_shutdown 关机前的空闲秒数，-1表示不自动关机
     */
    PowerSaveTimer(int cpu_max_freq, int seconds_to_sleep = 20, int seconds_to_shutdown = -1);
    
    /**
     * @brief 析构函数
     */
    ~PowerSaveTimer();

    /**
     * @brief 设置电源节能模式是否启用
     * 
     * @param enabled 是否启用电源节能模式
     */
    void SetEnabled(bool enabled);
    
    /**
     * @brief 设置进入睡眠模式时的回调函数
     * 
     * @param callback 进入睡眠模式时执行的回调函数
     */
    void OnEnterSleepMode(std::function<void()> callback);
    
    /**
     * @brief 设置退出睡眠模式时的回调函数
     * 
     * @param callback 退出睡眠模式时执行的回调函数
     */
    void OnExitSleepMode(std::function<void()> callback);
    
    /**
     * @brief 设置关机请求时的回调函数
     * 
     * @param callback 关机请求时执行的回调函数
     */
    void OnShutdownRequest(std::function<void()> callback);
    
    /**
     * @brief 唤醒设备
     * 
     * 从睡眠模式中唤醒设备
     */
    void WakeUp();

private:
    /**
     * @brief 电源节能检查
     * 
     * 定期检查是否需要进入睡眠模式或关机
     */
    void PowerSaveCheck();

    /**
     * @brief 电源节能定时器句柄
     */
    esp_timer_handle_t power_save_timer_ = nullptr;
    
    /**
     * @brief 电源节能模式是否启用
     */
    bool enabled_ = false;
    
    /**
     * @brief 是否处于睡眠模式
     */
    bool in_sleep_mode_ = false;
    
    /**
     * @brief 计时器计数
     */
    int ticks_ = 0;
    
    /**
     * @brief CPU最大频率
     */
    int cpu_max_freq_;
    
    /**
     * @brief 进入睡眠模式前的空闲秒数
     */
    int seconds_to_sleep_;
    
    /**
     * @brief 关机前的空闲秒数
     */
    int seconds_to_shutdown_;

    /**
     * @brief 进入睡眠模式时的回调函数
     */
    std::function<void()> on_enter_sleep_mode_;
    
    /**
     * @brief 退出睡眠模式时的回调函数
     */
    std::function<void()> on_exit_sleep_mode_;
    
    /**
     * @brief 关机请求时的回调函数
     */
    std::function<void()> on_shutdown_request_;
};
